/*
封装实现一个SqliteHelper类
提供简单的sqlite数据库操作接口
完成数据库的基础增删改查操作
主要实现一下的这些接口：
    1、创建或打开数据库
    2、对打开的数据库执行数据库操作语句
        1、表的操作
        2、数据库的操作
    3、关闭数据库
*/
#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <sqlite3.h>
using namespace std;


class SqliteHelper {
public :
    typedef int (*SqliteCallback)(void*, int, char**, char**); // 执行语句的回调函数
    SqliteHelper(const string& dbfile) 
        :_dbfile(dbfile)
        ,_handler(nullptr)
    {}

    bool open(int safe_level = SQLITE_OPEN_FULLMUTEX) {
        // int sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags, const char *zVfs );
        int ret = sqlite3_open_v2(_dbfile.c_str(), &_handler, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | safe_level, nullptr);
        if (ret == SQLITE_OK) {
            cout << "打开/创建数据库成功" << endl;
            return true;
        }
        cout << "创建/打开sqlite数据库失败: " << sqlite3_errmsg(_handler) << endl;
        return false;

    }
    bool execute(const string& sql, SqliteCallback callback, void* arg) {
        //int sqlite3_exec(sqlite3*, char *sql, int (*callback) (void*,int,char**,char**), void* arg, char **err) 
        int ret = sqlite3_exec(_handler, sql.c_str(), callback, arg, nullptr);
        if (ret != SQLITE_OK) {
            cout << "执行语句 [" << sql << "] 失败: " << sqlite3_errmsg(_handler) << endl;
            return false;
        }
        return true;
    }

    void close() {
        if (_handler) {
            sqlite3_close_v2(_handler);
        }
    }

private :
    string _dbfile;
    sqlite3* _handler; // sqlite数据库的操作句柄 
};